#include <stdio.h>
#include <string.h>
#include <process.h>
#include <ctype.h>

#define MAX_SIZE 1000
typedef struct {
    char ch[MAX_SIZE];
    int len;
}SeqString;
//朴素的模式匹配
int find(SeqString *s,SeqString *t){
    int i=0,j=0;//i和j分别表示主串s和待匹配串t的下标
    while((i<s->len)&&(j<t->len)){
        if(s->ch[i]==t->ch[j]){
            i++;
            j++;
        }else{
            //从主串的下一个位置开始比较
            i=i-j+1;
            j=0;
        }
    }
    if(j==t->len){
        return i-j;
    }
    return -1;
}

//统计英文单词的个数
int numWord(SeqString s){
    int count; // 初始化计数为0
    char pre=' '; // 记录前一个字符，初始为空格
    char nowWord; // 记录当前字符
    for (int i = 0; i < s.len; ++i) {
        nowWord=s.ch[i];
        if((pre==' ') && (nowWord!=' ') && (isalpha(nowWord))){
            count++;
            pre=nowWord;
        }else{
            pre=nowWord;
        }
    }
    return count;
}

//求字符串中出现某个字符出现次数
int num(SeqString *s, char target){
    int count = 0;
    for (int i = 0; i < s->len; ++i) {
        if(s->ch[i]==target){
            count++;
        }
    }
    return count;
}
int num1(SeqString *s, char target) {
    int count = 0;
    // 将目标字符统一转为小写（或大写），方便比较
    char targetLower = tolower(target);

    for (int i = 0; i < s->len; ++i) {
        // 将字符串中的当前字符也转为小写，再与目标字符比较
        if (tolower(s->ch[i]) == targetLower) {
            count++;
        }
    }
    return count;
}

int main(){
#ifdef _WIN32
    system("chcp 65001 > null");
#endif

    SeqString s, t;
    printf("测试 find 匹配函数：\n");
    printf("主串: ");
    //fgets(...)：接收用户从键盘输入的字符串，s.ch 是存放的地方，MAX_SIZE 是最多能存 1000 个字符（防止输入太长），stdin 表示 “从键盘输入”
    fgets(s.ch, MAX_SIZE, stdin);
    //用strcspn找到\n的位置，换成字符串结束符\0
    s.ch[strcspn(s.ch, "\n")] = '\0';
    //strlen(s.ch)：计算字符串的实际长度（比如 "abc" 的长度是 3），存到s.len里，方便后面查找时用
    s.len = strlen(s.ch);

    printf("模式串: ");
    fgets(t.ch, MAX_SIZE, stdin);
    t.ch[strcspn(t.ch, "\n")] = '\0';
    t.len = strlen(t.ch);

    int pos = find(&s, &t);
    printf(pos != -1 ? "位置: %d (从0开始)\n" : "未找到\n", pos);


    printf("\n测试 numWord 函数:\n");
    SeqString q;
    printf("请输入英文句子：");
    fgets(q.ch, MAX_SIZE, stdin);
    q.ch[strcspn(q.ch, "\n")] = '\0';
    q.len = strlen(q.ch);

    int wordCount = numWord(q);
    printf("单词个数：%d\n", wordCount);

    printf("\n测试 num 和 num1 函数:\n");
    SeqString g;
    char target;
    printf("请输入字符串：");
    fgets(g.ch, MAX_SIZE, stdin);
    g.ch[strcspn(g.ch, "\n")] = '\0';
    g.len = strlen(g.ch);

    printf("请输入要统计的字符：");
    scanf(" %c", &target);  // 空格用于跳过输入缓冲区的换行

    int result = num(&g, target);
    printf("字符 '%c' 出现的次数(区分大小写)：%d\n", target, result);
    int result1 = num1(&g, target);
    printf("字符 '%c' 出现的次数(不区分大小写)：%d\n", target, result1);
    return 0;
}